package com.starrocks.entity;

import lombok.Data;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 表同步配置实体
 */
@Data
public class SyncTableConfig {
    
    /**
     * 表名
     */
    private String tableName;
    
    /**
     * 主键字段（StarRocks中的字段名）
     */
    private String primaryKey;

    /**
     * 目标表自用主键字段（tidb中的字段名）
     */
    private String targetPrimaryPrimaryKey;
    
    /**
     * 更新时间字段（用于增量同步）
     */
    private String updateTimeField;
    
    /**
     * 是否启用
     */
    private Boolean enabled = true;
    
    /**
     * 批量大小
     */
    private Integer batchSize = 10000;
    
    /**
     * 是否启动时全量同步
     * true: 启动时先清空TiDB表，然后全量同步
     * false: 只进行增量同步（默认）
     */
    private Boolean fullSyncOnStartup = false;
    
    /**
     * 需要同步的字段列表（为空则同步所有字段）
     * 注意：这里填写的是StarRocks中的字段名
     */
    private List<String> syncFields;
    
    /**
     * 源数据库表名（如果与目标表名不同）
     */
    private String sourceTableName;
    
    /**
     * 目标数据库表名（如果与源表名不同）
     */
    private String targetTableName;
    
    /**
     * 字段映射配置
     * Key: StarRocks字段名
     * Value: TiDB字段名
     * 
     * 示例：
     * fieldMapping:
     *   device_id: deviceId
     *   device_name: deviceName
     */
    private Map<String, String> fieldMapping;
    
    /**
     * 是否使用目标表自己的ID（默认false，使用源表ID）
     */
    private Boolean useTargetId = false;
    
    /**
     * ID生成策略：AUTO_INCREMENT（自增）、UUID、SNOWFLAKE
     * 仅当useTargetId=true时有效
     */
    private String idGenerateStrategy;
    
    /**
     * 是否使用软删除（默认false，即物理删除）
     * 如果为false，当检测到源表数据被软删除时，会物理删除目标表对应数据
     */
    private Boolean useSoftDelete = false;
    
    /**
     * 软删除字段名（默认为 NULL）
     * 为空时使用 "is_delete"，用于标识数据是否被软删除：1表示已删除，0或NULL表示未删除
     */
    private String deleteField;
    
    /**
     * 获取源表名
     */
    public String getSourceTableName() {
        return sourceTableName != null ? sourceTableName : tableName;
    }
    
    /**
     * 获取目标表名
     */
    public String getTargetTableName() {
        return targetTableName != null ? targetTableName : tableName;
    }
    
    /**
     * 获取目标字段名（应用字段映射）
     * @param sourceFieldName StarRocks字段名
     * @return TiDB字段名
     */
    public String getTargetFieldName(String sourceFieldName) {
        if (fieldMapping != null && fieldMapping.containsKey(sourceFieldName)) {
            return fieldMapping.get(sourceFieldName);
        }
        return sourceFieldName; // 如果没有映射，使用相同的字段名
    }
    
    /**
     * 应用字段映射到整行数据
     * @param sourceData 源数据（StarRocks字段名）
     * @return 目标数据（TiDB字段名）
     */
    public Map<String, Object> applyFieldMapping(Map<String, Object> sourceData) {
        if (fieldMapping == null || fieldMapping.isEmpty()) {
            return sourceData; // 没有字段映射，直接返回
        }
        
        Map<String, Object> targetData = new HashMap<>();
        for (Map.Entry<String, Object> entry : sourceData.entrySet()) {
            String sourceField = entry.getKey();
            String targetField = getTargetFieldName(sourceField);
            targetData.put(targetField, entry.getValue());
        }
        
        return targetData;
    }
    
    /**
     * 获取映射后的主键字段名
     * @return TiDB中的主键字段名
     */
    public String getTargetPrimaryKey() {
        return getTargetFieldName(primaryKey);
    }
}

